package org.wmq.positiontoshop.service;

import com.google.common.hash.BloomFilter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.wmq.positiontoshop.model.DO.Shop;
import java.util.List;

/**
 * 布隆过滤器服务
 * 封装布隆过滤器的操作，提供更友好的接口
 */
@Service
@Slf4j
public class BloomFilterService {
    
    // 店铺ID布隆过滤器
    @Autowired
    @Qualifier("shopIdBloomFilter")
    private BloomFilter<Long> shopIdBloomFilter;
    
    // 字符串布隆过滤器
    @Autowired
    @Qualifier("stringBloomFilter")
    private BloomFilter<String> stringBloomFilter;
    
    /**
     * 添加店铺ID到布隆过滤器
     * 
     * @param shopId 店铺ID
     */
    public void addShopId(Long shopId) {
        if (shopId != null) {
            shopIdBloomFilter.put(shopId);
        }
    }
    
    /**
     * 批量添加店铺ID到布隆过滤器
     * 
     * @param shopIds 店铺ID集合
     */
    public void addShopIds(Iterable<Long> shopIds) {
        if (shopIds != null) {
            for (Long shopId : shopIds) {
                addShopId(shopId);
            }
        }
    }
    
    /**
     * 判断店铺ID是否可能存在
     * 返回true表示可能存在，返回false表示一定不存在
     * 
     * @param shopId 店铺ID
     * @return 是否可能存在
     */
    public boolean mightContainShopId(Long shopId) {
        return shopId != null && shopIdBloomFilter.mightContain(shopId);
    }
    
    /**
     * 添加字符串到布隆过滤器
     * 
     * @param key 字符串键
     */
    public void addString(String key) {
        if (key != null) {
            stringBloomFilter.put(key);
        }
    }
    
    /**
     * 批量添加字符串到布隆过滤器
     * 
     * @param keys 字符串键集合
     */
    public void addStrings(Iterable<String> keys) {
        if (keys != null) {
            for (String key : keys) {
                addString(key);
            }
        }
    }
    
    /**
     * 判断字符串是否可能存在
     * 返回true表示可能存在，返回false表示一定不存在
     * 
     * @param key 字符串键
     * @return 是否可能存在
     */
    public boolean mightContainString(String key) {
        return key != null && stringBloomFilter.mightContain(key);
    }
    
    @Autowired
    private ShopService shopService;

    /**
     * 初始化店铺ID布隆过滤器
     * 在应用启动时加载所有店铺ID到布隆过滤器
     */
    public void initializeShopIdBloomFilter() {
        try {
            log.info("开始初始化店铺ID布隆过滤器");
            // 获取所有店铺并将ID添加到布隆过滤器
            List<Shop> shops = shopService.lambdaQuery().select(Shop::getId).list();
            log.info("获取到{}个店铺，开始添加到布隆过滤器", shops.size());

            shops.forEach(shop -> shopIdBloomFilter.put(shop.getId()));
            log.info("店铺ID布隆过滤器初始化完成，已添加{}个店铺ID", shops.size());
        } catch (Exception e) {
            log.error("初始化店铺ID布隆过滤器失败", e);
            // 不抛出异常，避免影响应用启动
        }
    }
}